Functions এর মাধ্যমে Data Passing এবং প্রসেসিং in WebAssembly
WebAssembly (WASM) কোডে functions ব্যবহার করে ডেটা পাস করা এবং প্রসেস করা একটি গুরুত্বপূর্ণ এবং শক্তিশালী ধারণা। WebAssembly মডিউলগুলি ফাংশন, মেমরি, এবং অন্যান্য রিসোর্সকে এক্সপোর্ট ও ইমপোর্ট করতে পারে, এবং JavaScript (বা অন্য যে কোনো ওয়েব প্রযুক্তি) এর মাধ্যমে এই ফাংশনগুলোকে কল করা যায়।
ডেটা পাসিং এবং প্রসেসিং WebAssembly কোডের মধ্যে functions ব্যবহার করে করা হয়, এবং এটা সম্ভব হয় যখন JavaScript এবং WebAssembly একে অপরের সাথে ইন্টারঅ্যাক্ট করে। চলুন, দেখা যাক কিভাবে এই প্রসেস কাজ করে।
1. WebAssembly Functions এর মাধ্যমে Data Passing
WebAssembly মডিউলে functions প্যারামিটার গ্রহণ করে, যা JavaScript বা অন্য মডিউল থেকে পাস করা হয়। ফাংশনগুলো ডেটা প্রসেস করতে পারে এবং ফলাফল প্রদান করতে পারে। ফাংশন কলের মাধ্যমে ডেটা এক মডিউল থেকে অন্য মডিউলে পাঠানো যেতে পারে।
1.1 Basic Function Export/Import
WebAssembly মডিউল থেকে ফাংশন এক্সপোর্ট করা হয়, এবং JavaScript কোডে সেই ফাংশনটি ইমপোর্ট করে প্যারামিটার হিসেবে ডেটা পাস করা যায়।
WebAssembly (WASM) মডিউল:
(module
(import "env" "memory" (memory 1)) ;; মেমরি ইমপোর্ট
(export "add" (func $add)) ;; 'add' নামক ফাংশন এক্সপোর্ট
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add) ;; দুটি পূর্ণসংখ্যা যোগ করা
)এখানে, add নামক একটি ফাংশন আছে যা দুটি পূর্ণসংখ্যা প্যারামিটার হিসেবে গ্রহণ করে এবং তাদের যোগফল প্রদান করে।
1.2 JavaScript থেকে WebAssembly Function Call
fetch('your_program.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes))
.then(wasmModule => {
const { instance } = wasmModule;
// WebAssembly ফাংশন কল করা
const result = instance.exports.add(5, 3); // 5 এবং 3 পাস করা হচ্ছে
console.log('Result from WASM:', result); // আউটপুট হবে 8
})
.catch(console.error);এখানে, instance.exports.add(5, 3) দিয়ে WebAssembly মডিউলের add ফাংশন কল করা হয়েছে এবং দুটি প্যারামিটার (5, 3) পাস করা হয়েছে। WebAssembly কোড দুটি সংখ্যা যোগ করে তার ফলাফল JavaScript এ ফেরত পাঠাবে।
2. Complex Data Passing Between WebAssembly and JavaScript
WebAssembly তে সাধারণত প্রিমিটিভ ডেটা (যেমন: integer, float) পাস করা হয়। তবে, জটিল ডেটা (যেমন arrays বা structs) পাস করতে Linear Memory ব্যবহার করা হয়, যেখানে মেমরি অ্যাক্সেস এবং ডেটা শেয়ার করা যায়।
2.1 Passing Arrays Between JavaScript and WebAssembly
ধরা যাক, একটি অ্যারে WebAssembly কোডে পাস করতে হবে, যাতে মেমরি শেয়ারিং এর মাধ্যমে ডেটা পাস করা হবে।
WebAssembly মডিউল (WASM):
(module
(memory 1)
(export "memory" (memory 0))
(export "processArray" (func $processArray))
(func $processArray (param $ptr i32) (param $len i32)
local.get $ptr
local.get $len
loop $loop
local.get $ptr
i32.load
;; এখানে আপনার প্রসেসিং কোড হবে
local.set $ptr
local.get $len
i32.sub
local.set $len
br_if $loop
)
)এখানে, processArray ফাংশনটি একটি পয়েন্টার এবং অ্যারের দৈর্ঘ্য গ্রহণ করে এবং মেমরি থেকে ডেটা একে একে প্রসেস করতে পারে।
2.2 JavaScript থেকে Arrays পাঠানো এবং প্রসেস করা
fetch('your_program.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes))
.then(wasmModule => {
const { instance } = wasmModule;
// WebAssembly মেমরিতে অ্যারে পাস করা
const memory = new Int32Array(instance.exports.memory.buffer);
// একটি অ্যারে ডেটা প্রস্তুত করা
const arr = new Int32Array([1, 2, 3, 4, 5]);
// WebAssembly মেমরিতে ডেটা কপি করা
memory.set(arr, 0); // মেমরির প্রথম 5টি সেলে ডেটা কপি
// WebAssembly ফাংশন কল করা
instance.exports.processArray(0, arr.length);
// মেমরি থেকে প্রসেস করা ডেটা বের করা
console.log(memory.slice(0, arr.length)); // প্রসেসড অ্যারে আউটপুট দেখাবে
})
.catch(console.error);এখানে, JavaScript কোড arr নামক একটি অ্যারে তৈরি করে এবং সেটিকে WebAssembly মেমরিতে কপি করে, তারপর processArray ফাংশনটি কল করে। WebAssembly মডিউলটি এই অ্যারে প্রসেস করে এবং ফলাফল JavaScript এ ফেরত পাঠায়।
3. Data Processing Using WebAssembly Functions
WebAssembly ফাংশন সাধারণত গাণিতিক বা সিম্পল ডেটা প্রসেসিং করতে ব্যবহৃত হয়। যখন ফাংশনগুলো JavaScript থেকে ডেটা গ্রহণ করে, সেগুলি মেমরিতে ডেটা প্রসেস করতে পারে এবং ফলাফল ফেরত পাঠাতে পারে।
3.1 Example of Data Processing - Multiplying Numbers
WebAssembly মডিউল (WASM):
(module
(export "multiply" (func $multiply))
(func $multiply (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.mul) ;; দুটি সংখ্যা গুণ করা
)এখানে multiply ফাংশন দুটি সংখ্যাকে গুণ করে।
3.2 JavaScript Example for Data Processing
fetch('multiply_program.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes))
.then(wasmModule => {
const { instance } = wasmModule;
// WebAssembly ফাংশন কল করা
const result = instance.exports.multiply(5, 7); // 5 এবং 7 গুণ করা
console.log('Multiplication result from WASM:', result); // আউটপুট হবে 35
})
.catch(console.error);এখানে, JavaScript কোডটি WebAssembly এর multiply ফাংশন কল করে দুটি সংখ্যার গুণফল বের করছে।
Summary
- Data Passing: WebAssembly এর ফাংশনগুলি প্রিমিটিভ ডেটা (যেমন integers) এবং জটিল ডেটা (যেমন arrays) পাস করতে পারে। এটি JavaScript এবং WebAssembly এর মধ্যে মেমরি শেয়ারিং এবং ডেটা এক্সচেঞ্জ করার জন্য উপকারী।
- Memory Management: Linear Memory ব্যবহার করে WebAssembly মডিউলগুলি ডেটা প্রসেস করতে পারে এবং সেই ডেটা JavaScript এ ফেরত পাঠাতে পারে। মেমরি অ্যাক্সেসের জন্য বিভিন্ন কম্পাইলার ইন্সট্রাকশন ব্যবহার করা হয়, যেমন
i32.load,i32.storeইত্যাদি। - Data Processing: WebAssembly ফাংশন JavaScript থেকে ডেটা গ্রহণ করে সেগুলি প্রসেস করে এবং ফলাফল প্রদান করে। এইভাবে WebAssembly ওয়েব অ্যাপ্লিকেশনগুলিতে উচ্চ পারফরম্যান্স গাণিতিক কাজ বা ডেটা প্রসেসিং করতে সাহায্য করে।
WebAssembly এর এই শক্তিশালী ক্ষমতা JavaScript এবং অন্যান্য ওয়েব প্রযুক্তির সাথে একত্রে কাজ করতে এবং জটিল ডেটা প্রসেসিংয়ের জন্য পারফরম্যান্স বাড়াতে সহায়তা করে।
Read more